<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <title>统计1出现的次数</title>
</head>

<body>
    <p>1~11中1出现的次数：</p>
    <div id="result"></div>
    <script>
        function getOne2(n, x) {
            // 初始化位因子，从个位(10^0)开始
            let factor = 1;
            // 用于累计数字x出现的总次数
            let count = 0;
            // 初始化next为n，用于判断是否还有更高位需要处理
            let next = parseInt(n / factor);

            // 循环处理每一位数，直到没有更高位
            while (next !== 0) {
                // 计算当前位右边的数值（低位部分）
                let lower = n - next * factor;
                // 获取当前位上的数字
                let cur = next % 10;
                // 计算当前位左边的数值（高位部分）
                let high = parseInt(n / (factor * 10));

                // 根据当前位数字与目标数字x的关系，计算该位出现x的次数
                if (cur > x) {
                    // 当前位大于x时，高位可取值范围为0~high，共(high+1)种可能
                    count += (high + 1) * factor;
                } else if (cur === x) {
                    // 当前位等于x时，高位为0~high-1时低位可任意，高位为high时低位只能取0~lower
                    count += (high * factor + lower + 1);
                } else {
                    // 当前位小于x时，高位只能取0~high-1
                    count += high * factor;
                }

                // 位因子乘以10，处理更高一位（如从个位到十位）
                factor *= 10;
                // 更新next为n除以下一位因子，用于判断是否还有更高位
                next = parseInt(n / factor);
            }

            // 返回数字x在1到n中出现的总次数
            return count;
        }

        // 计算1~11中数字1出现的次数
        const result = getOne2(1000, 3);

        // 显示结果到HTML页面中id为'result'的元素
        document.getElementById('result').textContent = result;
    </script>
</body>

</html>